package com.ato.java;

/**
 * @author wangjing
 * @create 2021--08--02--22:43
 */

/**
 * 编写类的时候，其实就是描述属性和方法，但是并没有实质上的对象（类的实例化），只有new 构造方法() 时 才会产生对象，并分配内存空间
 * 某些情况下，不管你new几次，就只需要其中一个数据在内存中只有一个！！！  就要用到static 定义了static的 就是共享的。
 *
 *
 * 如何使用：
 * 修饰：类的结构：属性 方法 内部类 代码块
 *
 * 修饰属性：
 * 属性是否使用static修饰，分为静态属性和非静态属性（实例属性（变量））也可以称之为类变量
 *          非静态变量：创建多个对象。每个对象都独立拥有一套类中的独立属性（非静态变量），
 *                      当修改一个对象中非静态变量时，不会影响其他对象的非静态属性
 *          静态变量 ： 使用了static后。所有new了该类的对象都公用静态变量，当通过某一个对象去修改静态变量是
 *                      其他对象调用时，会是修改后的
 *         其他说明：1：静态变量随着类的加载而加载,可以通过类.静态变量调用
 *                 2：静态变量的加载要早于对象的创建（通过new后赋值的实例化对象）
 *                 3：类只会加载一次，因此 静态变量在内存中也只会加载一次
 * 修饰方法：
 *  也是随着类的加载而加载，也是通过类.方法() 可以直接调用
 *     静态方法中：只能调用静态方法和属性！！！！
 *     非静态方法中，都可以调用
 *     静态方法中，不能调用this和super
 *
 */
public class Static01 {
    public static void main(String[] args) {
        Chinese.common = "静态变量随着类加载，早于非静态变量";
        Chinese.eat();
        System.out.println(Chinese.common );
        Chinese c1 = new Chinese();
        c1.name = "小明";
        c1.age = 18;
        c1.common = "c1调用了static的";

        Chinese c2 = new Chinese();
        c2.name = "小王";
        c2.age = 28;
        System.out.println("c2调用静态变量：  " + c2.common);
    }
}

class Chinese {
    static String common;
    String name;
    int age;
    public static  void eat (){
        System.out.println("静态方法：和属性一样：随着类的加载而加载，通过类.方法()可以直接调用");
    }
}
